package manager;

import gui.Case;
import java.awt.event.MouseEvent;
import java.awt.event.MouseListener;
import java.awt.event.MouseMotionListener;
import controlleur.ControllerGrille;
import gui.Grille;
import java.util.ArrayList;
import jreversi.Coordonnee;
import jreversi.EtatCase;
import moteur.Plateau;

public class EventManager implements MouseListener, MouseMotionListener
{

    private ControllerGrille gController;
    private int lastXMove = -1; // Pour avoir notre dernier Mouvement
    private int lastYMove = -1; // Pour avoir notre dernier Mouvement
    private static EventManager instance;

    /** Récupère l'instance unique de la class Singleton.<p>
     * Remarque : le constructeur est rendu inaccessible
     */
    public static EventManager getInstance()
    {
        if (instance == null)
        { // Premier appel
            instance = new EventManager();
        }
        return instance;
    }

    private EventManager()
    {
        gController = new ControllerGrille();
    }

    public void mouseClicked(MouseEvent e)
    {
        mouseExited(e);
        Case cas = (Case) (e.getSource());
        int X = cas.getxX();
        int Y = cas.getyY();

        /*
        Ceci permet au prix de trois attribut d'économisé le temps de calcul de coupPossible puisqu'il a été 
        calculé en entrant sur la case
         */
        if (X == lastXMove && Y == lastYMove)
        {
            Plateau.getInstance().posePion(X, Y, gController.getCasesAFlip());
            Grille.getInstance().repaint();
        }
    }

    public void mousePressed(MouseEvent e)
    {
    }

    public void mouseReleased(MouseEvent e)
    {
    }

    public void mouseEntered(MouseEvent e)
    {
        Case cas = (Case) (e.getSource());
        int X = cas.getxX();
        int Y = cas.getyY();

        if (gController.coupPossible(X, Y))
        {
            lastXMove = X;
            lastYMove = Y;
            ArrayList<Coordonnee> caseFlipTemp = gController.getCasesAFlip();
            Plateau.getInstance().saveTab();
            for (Coordonnee coordonnee : caseFlipTemp)
            {
                Grille.getInstance().getPion()[coordonnee.getX()][coordonnee.getY()].setEtatCase(EtatCase.PRENABLE);
            }
            Grille.getInstance().repaint();
        }
    }

    public void mouseExited(MouseEvent e)
    {
        ArrayList<Coordonnee> caseFlipTemp = gController.getCasesAFlip();
        Plateau.getInstance().restoreTab();
        for (Coordonnee coordonnee : caseFlipTemp)
        {
            Grille.getInstance().getPion()[coordonnee.getX()][coordonnee.getY()].setEtatCase(EtatCase.NJOUABLE);
        }
        Grille.getInstance().repaint();

    }

    public void mouseDragged(MouseEvent e)
    {
    }

    public void mouseMoved(MouseEvent e)
    {
    }
    
    public static void reset(){
        instance = null;
    }
}
